package com.guoguo.utils;

import java.lang.reflect.Method;

/**
 * Created by Administrator on 2017/8/17 0017.
 */
public class ClazzUtils {

    public static boolean isEmpty(String className) {
        try {
            Class c;
            c = Class.forName(className);
            Object classObj = c.newInstance();
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * <pre>
     * 把两个bean对象里相同的属性进行复制。
     * 两个bean对象里，能够复制的属性名和类型得一致，否则无法复制。
     * </pre>
     *
     * @param sourObj 复制的源对象
     * @param tarObj  复制后的目标对象。
     * @return Object 返回复制后的目标对象
     */
    public static Object copyBean(Object sourObj, Object tarObj) {
        Method[] method1 = getObjectMethods(sourObj);
        Method[] method2 = getObjectMethods(tarObj);
        String methodName1;
        String methodFix1;
        String methodName2;
        String methodFix2;
        for (Method sourMethod : method1) {
            methodName1 = sourMethod.getName();
            methodFix1 = methodName1.substring(3, methodName1.length());
            if (methodName1.startsWith("get")) {
                for (Method tarMethod : method2) {
                    methodName2 = tarMethod.getName();
                    methodFix2 = methodName2.substring(3, methodName2.length());
                    if (methodName2.startsWith("set")) {
                        if (methodFix2.equals(methodFix1)) {
                            Object[] objs1 = new Object[0];
                            Object[] objs2 = new Object[1];
                            try {
                                // 激活sourObj的相应的get的方法，objs1数组存放调用该方法的参数,此例中没有参数，该数组的长度为0
                                objs2[0] = sourMethod.invoke(sourObj, objs1);
                                // 激活tarObj的相应的set的方法，objs2数组存放调用该方法的参数
                                tarMethod.invoke(tarObj, objs2);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            continue;
                        }
                    }
                }
            }
        }
        return tarObj;
    }

    /**
     * 获得对象的所有方法
     *
     * @param object 需要反射的对象
     * @return 对象的所有方法数组。
     */
    @SuppressWarnings("rawtypes")
    public static Method[] getObjectMethods(Object object) {
        Class<? extends Object> clazz = object.getClass();
        return clazz.getMethods();
    }

    /**
     * 调用对象的get方法
     *
     * @param obj  需要反射的对象
     * @param name 对象的属性名
     * @return Object 返回对象get方法返回的对象。
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static Object getMethodInvoke(Object obj, String name) {
        if (null != name && !"".equals(name)) {
            String getMethod = "get" + StringUtils.toUpperCaseFirstOne(name);
            Class<? extends Object> clazz = obj.getClass();
            Object object = null;
            try {
                Method method = clazz.getMethod(getMethod, new Class[]{});
                object = method.invoke(obj, new Class[]{});
            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;
        }
        return null;
    }

    /**
     * 根据类名获取指定的Class
     *
     * @param className class名。
     * @return Class 返回一个Class对象。
     */
    public static Class getEntityClass(String className) {
        Class cls = null;
        if (isEmpty(className)) {
            try {
                cls = Class.forName(className);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } // 加载指定的Java类
            return cls;
        }
        return cls;
    }
}
